/**
 * userController.js - 用户控制器
 * 
 * 这个控制器处理与用户资源相关的请求，如获取用户列表、获取单个用户、更新用户等。
 */

const userService = require('../services/userService');
const { NotFoundError, ForbiddenError } = require('../utils/errors');
const { successResponse, noContentResponse, paginatedResponse } = require('../utils/responseHandler');

/**
 * 获取所有用户控制器
 * 
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - 下一个中间件函数
 */
const getAllUsers = async (req, res, next) => {
  try {
    // 获取分页参数
    const page = parseInt(req.query.page, 10) || 1;
    const limit = parseInt(req.query.limit, 10) || 10;
    
    // 获取用户列表
    const { users, total } = await userService.findAllUsers(page, limit);
    
    // 返回分页响应
    return paginatedResponse(res)(
      users.map(user => ({
        id: user.id,
        username: user.username,
        email: user.email,
        role: user.role,
        createdAt: user.createdAt,
      })),
      page,
      limit,
      total,
      '成功获取用户列表'
    );
  } catch (error) {
    next(error);
  }
};

/**
 * 获取单个用户控制器
 * 
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - 下一个中间件函数
 */
const getUserById = async (req, res, next) => {
  try {
    const { id } = req.params;
    
    // 检查当前用户是否有权限访问
    if (req.user.role !== 'admin' && req.user.id !== id) {
      return next(new ForbiddenError('没有权限访问此用户信息'));
    }
    
    // 查找用户
    const user = await userService.findUserById(id);
    if (!user) {
      return next(new NotFoundError('用户未找到'));
    }
    
    // 返回用户信息
    return successResponse(res)({
      id: user.id,
      username: user.username,
      email: user.email,
      role: user.role,
      createdAt: user.createdAt,
      updatedAt: user.updatedAt,
    });
  } catch (error) {
    next(error);
  }
};

/**
 * 更新用户控制器
 * 
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - 下一个中间件函数
 */
const updateUser = async (req, res, next) => {
  try {
    const { id } = req.params;
    const updateData = req.body;
    
    // 检查当前用户是否有权限更新
    if (req.user.role !== 'admin' && req.user.id !== id) {
      return next(new ForbiddenError('没有权限更新此用户'));
    }
    
    // 查找用户
    let user = await userService.findUserById(id);
    if (!user) {
      return next(new NotFoundError('用户未找到'));
    }
    
    // 更新用户
    user = await userService.updateUser(id, updateData);
    
    // 返回更新后的用户信息
    return successResponse(res)({
      id: user.id,
      username: user.username,
      email: user.email,
      role: user.role,
      updatedAt: user.updatedAt,
    }, '用户更新成功');
  } catch (error) {
    next(error);
  }
};

/**
 * 删除用户控制器
 * 
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - 下一个中间件函数
 */
const deleteUser = async (req, res, next) => {
  try {
    const { id } = req.params;
    
    // 查找用户
    const user = await userService.findUserById(id);
    if (!user) {
      return next(new NotFoundError('用户未找到'));
    }
    
    // 删除用户
    await userService.deleteUser(id);
    
    // 返回无内容响应
    return noContentResponse(res)();
  } catch (error) {
    next(error);
  }
};

module.exports = {
  getAllUsers,
  getUserById,
  updateUser,
  deleteUser,
};